package com.hht.toolanduilibs.util

import android.graphics.*


/**
 * Author:chen'hu
 * Time:2024/4/26 16:41
 * Description:设置bitmap的brightness contrast saturation hue
 */
object AdjustBitmapUtils {
    private val mBitmapPaint = Paint()
    private val colorMatrix = ColorMatrix()
    private val saturationMatrix = ColorMatrix()
    private val hueMatrix = ColorMatrix()


    /**
     * 对于亮度（brightness）、对比度（contrast）、饱和度（saturation）和色调（hue）这几个参数，
     * 它们的范围通常是在特定的值范围内进行调整以获得最佳效果。以下是一般情况下这些参数的常见范围：
    1. 亮度（brightness）：通常在-255到+255之间调整，负值表示降低亮度，正值表示增加亮度。
    2. 对比度（contrast）：通常在0.5到2.0之间调整，小于1表示降低对比度，大于1表示增加对比度。
    3. 饱和度（saturation）：通常在0.0到2.0之间调整，0表示完全灰度图像，1表示原始饱和度，大于1表示增加饱和度。
    4. 色调（hue）：通常在0到360之间调整，表示色调的角度，0和360表示红色，120表示绿色，240表示蓝色。
     * */
    fun adjustBitmap(
        bitmap: Bitmap,
        brightness: Float,
        contrast: Float,
        saturation: Float,
        hue: Float,
    ): Bitmap {
        val adjustedBitmap = Bitmap.createBitmap(bitmap.width, bitmap.height, bitmap.config)
        updatePaint(brightness, contrast, saturation, hue)
        val canvas = Canvas(adjustedBitmap)
        canvas.drawBitmap(bitmap, 0f, 0f, mBitmapPaint)
        return adjustedBitmap
//        val width: Int = adjustedBitmap.width
//        val height: Int = adjustedBitmap.height
//        return Bitmap.createBitmap(adjustedBitmap, 0, 0, width, height, getMatrix(width), false);
    }

    private fun updatePaint(
        brightness: Float,
        contrast: Float,
        saturation: Float,
        hue: Float,
    ) {

        colorMatrix.set(floatArrayOf(
            contrast, 0f, 0f, 0f,
            brightness, 0f, contrast, 0f,
            0f, brightness, 0f, 0f,
            contrast, 0f, brightness, 0f,
            0f, 0f, 1f, 0f))

        saturationMatrix.setSaturation(saturation)

        hueMatrix.setRotate(0, hue)
        hueMatrix.setRotate(1, hue)
        hueMatrix.setRotate(2, hue)

        val combinedMatrix = ColorMatrix()
        combinedMatrix.postConcat(colorMatrix)
        combinedMatrix.postConcat(saturationMatrix)
        combinedMatrix.postConcat(hueMatrix)
        mBitmapPaint.colorFilter = ColorMatrixColorFilter(combinedMatrix)
    }

    private fun getMatrix(width: Int): Matrix {
        val matrix = Matrix()
        matrix.preScale(-1.0f, 1.0f);
        // 由于翻转是在原点进行的，我们需要将Bitmap移动到原点，然后再翻转
        // val width: Int = adjustedBitmap.width
        // val height: Int = adjustedBitmap.height
        matrix.postTranslate(width.toFloat(), 0f)
        return matrix
    }

    //得到亮度的真实值,通常在-255到+255之间调整
    //调整为-100到100之间（上面太亮太黑）
    fun calculateBrightnessValue(progress: Int): Float {
        return progress * 200F / 100F - 100F
    }

    fun getBrightnessProgress(mappedValue: Float): Int {
        return ((mappedValue + 100) * 100 / 200).toInt()
    }

    //得到对比度的真实值,通常在0.5到2.0之间调整
    fun calculateContrastValue(progress: Int): Float {
        return 0.5F + progress / 100.0F * (2.0F - 0.5F)
    }

    fun getContrastProgress(mappedValue: Float): Int {
        return ((mappedValue - 0.5) / (2.0 - 0.5) * 100).toInt()
    }

    //得到饱和度的真实值,通常在0.0到2.0之间调整
    fun calculateSaturationValue(progress: Int): Float {
        return progress / 100.0F * 2.0F
    }

    fun getSaturationProgress(mappedValue: Float): Int {
        return (mappedValue / 2.0 * 100).toInt()
    }

    //得到色调真实值,通常在0到360之间调整，
    //改为0到2之间调整
    fun calculateHueValue(progress: Int): Float {
        return (progress / 100.0F * 2.0F)
    }

    fun getHueProgress(mappedValue: Float): Int {
        return (mappedValue / 2.0 * 100).toInt()
    }
}